﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using SistemaCenterQuimPost.Control;  //usado para validar observación
using SistemaCenterQuimPost.Plantillas; //necesario para obtener fecha, nombre usuario etc,

namespace SistemaCenterQuimPost.UI.PostCajero
{
    public partial class frmAperturaCaja : SistemaCenterQuimPost.Plantillas.frmPlantillaHijo
    {
        //-------------ATRIBUTOS-------------------------------
        
        private DataSet2 cajaDs;   // variables que me permiten acceder a la base de dato caja.
        private DataSet2TableAdapters.CajasTableAdapter cajaTa;

        //atributo usados para abrir una caja
        private double cajaInicial;


        //-----------CONSTRUCTORES---------------------------

        public frmAperturaCaja()
        {
            InitializeComponent();

            cajaDs = new DataSet2();                // inicializa variables que me permiten acceder a la base de dato caja.
            cajaTa = new DataSet2TableAdapters.CajasTableAdapter();

            //inicializa atributos usados para abrir una caja.
            this.cajaInicial = 0;


        }

        //--------------ESTADOS-----------------------------------
        private void frmAperturaCaja_Load(object sender, EventArgs e)
        {
            lblError.Visible = false;  //al ser un formulario de un solo estado, esta propiedad es seteada acá.

        }

        //-------------METODOS VARIOS----------------------

        public void obtenerDatosUltimaCaja()  //obtiene los datos de la última caja, turnos y CajaFinal.
        {
            try
            {
                int codUltimaCaja = 0;  //almacenará el código de la última caja, si existe.

                codUltimaCaja = Convert.ToInt32(cajaTa.ScalarQueryCaja()); //busca la ultima caja si hay registros.

                cajaTa.FillByNroCaja(cajaDs.Cajas, codUltimaCaja); //busca todos los datos de la ultima caja


                if (cajaDs.Cajas[0].estado == "A")
                {
                    string nombreUsCajaAbierta;

                    nombreUsCajaAbierta = getNombreUsuarioCajaAbierta(cajaDs.Cajas[0].codUsuarioApertura);

                    DialogResult result = MessageBox.Show("El siguiente registro de caja se encuentra abierto:\n\n Fecha: " + cajaDs.Cajas[0].fechaCaja.ToString("d") + "\n Turno: " + cajaDs.Cajas[0].turno.ToString() + "\nCajero: " + nombreUsCajaAbierta + "\n\n ¿Desea cerrar esta caja?", "INFORMES", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                    if (result == DialogResult.Yes) //si quiere cerrar esa caja
                    {
                        cerrarCaja(codUltimaCaja);

                        if (DateTime.Compare(Convert.ToDateTime(obtenerFechaActual()),cajaDs.Cajas[0].fechaCaja) == 0)
                        {
                            verificarTurnosDisponibles(cajaDs.Cajas[0].turno, cajaDs.Cajas[0].cajaFinal); //una vez que se cerró la caja se envían los datos para abrir otro registro.
                        }else
                        {
                            verificarTurnosDisponibles("", cajaDs.Cajas[0].cajaFinal); //si se quiere abrir la primera caja posterior a la fecha del ultimo cierre.

                        }

                    }
                    else
                    {
                        MessageBox.Show("Recordamos que las ventas actuales, impactarán sobre la caja que se encuentra abierta.", "INFORMES", MessageBoxButtons.OK, MessageBoxIcon.Information);

                        this.Close(); //cerramos (liberamos) el formulario, que aunque no lo mostramos, se agrego a los hijos del menu.
                    }

                }
                else
                {

                    if (DateTime.Compare(Convert.ToDateTime(obtenerFechaActual()), cajaDs.Cajas[0].fechaCaja) == 0)
                    {
                        verificarTurnosDisponibles(cajaDs.Cajas[0].turno, cajaDs.Cajas[0].cajaFinal); //una vez que se cerró la caja se envían los datos para abrir otro registro.
                    }
                    else
                    {
                        verificarTurnosDisponibles("", cajaDs.Cajas[0].cajaFinal); //si se quiere abrir la primera caja posterior a la fecha del ultimo cierre.

                    }

                }
            }

            catch (IndexOutOfRangeException)  //excepcion cuando no encuentra registro en la base de datos caja.
            {
                verificarTurnosDisponibles("", 0); //en caso de que no existan registros de caja, se envia los datos para abrir una.

            }

            catch (Exception ex)
            {
                //Por cualquier otra excepcion se informa el error, en este caso es un error grave.
                MessageBox.Show("La conexión a la base de datos no fué exitosa.\n\n Comuniquese con su desarrollador para solucionar el problema.\n\n" + ex.Message, "ERROR GRAVE - ACCESO A BASE DE DATO", MessageBoxButtons.OK, MessageBoxIcon.Error);

            }

        }

        private void verificarTurnosDisponibles(string turnoInicio, double cajaInicial)  //método que verifica si existían turnos disponible para la caja en la fecha actual.
        {
            this.cboTurno.Items.Clear();

            if (turnoInicio == "")
            {
                cboTurno.Items.Add("M");
                cboTurno.Items.Add("T");
                cboTurno.Items.Add("N");

            }
            else
            {
                if (turnoInicio == "M")
                {
                    cboTurno.Items.Add("T");
                    cboTurno.Items.Add("N");
                }
                else
                {
                    if (turnoInicio == "T")
                    {
                        cboTurno.Items.Add("N");
                    }
                    else
                    {

                    }

                }

            }

            if (cboTurno.Items.Count == 0)
            {
                MessageBox.Show("No existe turnos disponible para abrir una caja en la fecha.", "INFORMES", MessageBoxButtons.OK, MessageBoxIcon.Information);

                this.Close(); //se cierra el formulario actual, de esta manera liberamos la ligadura del formulario con el menu.

            }
            else
            {
                //Se establece los valores necesarios para mostrar en la interface apertura de caja.
                lblNombreCajeroValor.Text = obtenerNombreUsuarioActual();
                lblCajaInicialValor.Text = cajaInicial.ToString();

                this.Show(); //mostramos la interface

                //se establece los atributos para abrir una caja
                this.cajaInicial = cajaInicial;

            }
        }

        private void cerrarCaja(int codCajaAbierta) //metodo que cierra la caja que está abierta.
        {
            try
            {
                //(ALE) hace la instrucciones para cerrar la caja, acordate que ya tenes DataSet y DataAdapter de Caja. No lo crees de vuelta. que recibis el código de caja.
                cajaTa.FillByNroCaja(cajaDs.Cajas, codCajaAbierta);//se buwsca el registrp
                cajaDs.Cajas[0].estado = "C";//se cierra
                cajaDs.Cajas[0].observacion = cajaDs.Cajas[0].observacion + "CIERRE: LA CAJA NO SE HA CERRADO CORRECTAMENTE.";
                cajaDs.Cajas[0].codUsuarioCierre = obtenerCodUsuarioActual(); //(MARIANO) ASIGNALE EL CODIGO DE USUARIO QUE CORRESPONDA
                cajaTa.Update(cajaDs.Cajas); //se actualiza

            }
            catch (Exception ex)
            {
                //Por cualquier otra excepcion se informa el error, en este caso es un error grave.
                MessageBox.Show("La conexión a la base de datos no fué exitosa.\n\n Comuniquese con su desarrollador para solucionar el problema.\n\n" + ex.Message, "ERROR GRAVE - ACCESO A BASE DE DATO", MessageBoxButtons.OK, MessageBoxIcon.Error);

                //this.Close();
            }

            MessageBox.Show("La caja ha sido cerrada correctamente.", "INFORMES", MessageBoxButtons.OK, MessageBoxIcon.Information);

        }

        private void btnRegistrar_Click(object sender, EventArgs e)  //captura el evento cuando se presiona Enter en btn.
        {
            if (formularioValido())
            {
                //Se abre la caja
                cajaTa .InsertQueryCaja (Convert.ToDateTime(obtenerFechaActual()), this.cboTurno.SelectedItem.ToString(), obtenerCodUsuarioActual(), Math.Round(Convert.ToDecimal(this.cajaInicial), 3), 0, 0, "A", "APERTURA: " + txtObservación.Text.Trim().ToUpper() + ". ", 0, 0, 0, Math.Round(Convert.ToDecimal(this.cajaInicial), 3), 0,0,0);

                MessageBox.Show("La caja ha sido abierta correctamente.", "INFORMES", MessageBoxButtons.OK, MessageBoxIcon.Information);

                this.Close();

            }else
            {
                informarExistenciaError();
            }

        }

        private bool formularioValido()  //método que valida el formulario
        {
            validarTurno();

            validarObservacion(); //llama al método validar observación

            if ((errorProvider1.GetError(txtObservación) == "") & (errorProvider1.GetError(cboTurno) == ""))
            {
                return true;
            }
            else
            {
                return false;
            }

        }

        private void validarTurno() //valida que el usuario haya seleccionado algún turno
        {
            if (cboTurno.Text == "")
            {
                errorProvider1.SetError(cboTurno, "Debe seleccionar algún turno");
            }else
            {
                errorProvider1.SetError(cboTurno, "");
            }
        }

        private void validarObservacion()  //método que valida el txtObservación.
        {
            errorProvider1.SetError(txtObservación, new ValidarDatos().validarLongitud("Observación:", txtObservación.Text, 100));

        }



        private int obtenerCodUsuarioActual()  //Dato necesario para la apertura de una caja
        {
            frmPlantillaPadre unFrm = (frmPlantillaPadre)this.MdiParent;
            return unFrm.getCodUsuario();
        }


        private string obtenerNombreUsuarioActual()  //Dato necesario para la apertura de una caja
        {
            frmPlantillaPadre unFrm = (frmPlantillaPadre)this.MdiParent;
            return unFrm.getNombreUsuario();
        }


        private string obtenerFechaActual()  //Dato necesario para la apertura de una caja.
        {
            frmPlantillaPadre unFrm = (frmPlantillaPadre)this.MdiParent;
            return unFrm.getFechaActual();
        }


        private string getNombreUsuarioCajaAbierta(int codUsuarioApertura) //método que obtiene el usuario de una caja abierta.
        {
            DataSet2 UsuariosDs = new DataSet2();
            DataSet2TableAdapters.UsuariosTableAdapter UsuariosDa = new DataSet2TableAdapters.UsuariosTableAdapter();

            try
            {
                UsuariosDa.FillByCodigoUsuario(UsuariosDs.Usuarios, codUsuarioApertura);

                return UsuariosDs.Usuarios[0].nombreUsuario;

            }

            catch (IndexOutOfRangeException)
            {
                return "Usuario ya eliminado.";

            }

            catch (Exception)
            {
                return "";

            }

        }

    }
}
